1 /*
2 * Copyright (C) 2007 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21
22 import com.google.common.annotations.GwtCompatible;
23 import com.google.common.annotations.GwtIncompatible;
24 import com.google.common.base.Predicate;
25 import com.google.common.base.Predicates;
26 import com.google.common.collect.Collections2.FilteredCollection;
27
28 import java.io.Serializable;
29 import java.util.AbstractSet;
30 import java.util.Arrays;
31 import java.util.Collection;
32 import java.util.Collections;
33 import java.util.Comparator;
34 import java.util.EnumSet;
35 import java.util.HashSet;
36 import java.util.Iterator;
37 import java.util.LinkedHashSet;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.NavigableSet;
41 import java.util.NoSuchElementException;
42 import java.util.Set;
43 import java.util.SortedSet;
44 import java.util.TreeSet;
45 import java.util.concurrent.ConcurrentHashMap;
46 import java.util.concurrent.CopyOnWriteArraySet;
47
48 import javax.annotation.Nullable;
49
50 /**
51 * Static utility methods pertaining to {@link Set} instances. Also see this
52 * class's counterparts {@link Lists}, {@link Maps} and {@link Queues}.
53 *
54 * <p>See the Guava User Guide article on <a href=
55 * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Sets">
56 * {@code Sets}</a>.
57 *
58 * @author Kevin Bourrillion
59 * @author Jared Levy
60 * @author Chris Povirk
61 * @since 2.0 (imported from Google Collections Library)
62 */
63 @GwtCompatible(emulated = true)
64 public final class Sets {
65 private Sets() {}
66
67 /**
68 * {@link AbstractSet} substitute without the potentially-quadratic
69 * {@code removeAll} implementation.
70 */
71 abstract static class ImprovedAbstractSet<E> extends AbstractSet<E> {
72 @Override
73 public boolean removeAll(Collection<?> c) {
74 return removeAllImpl(this, c);
75 }
76
77 @Override
78 public boolean retainAll(Collection<?> c) {
79 return super.retainAll(checkNotNull(c)); // GWT compatibility
80 }
81 }
82
83 /**
84 * Returns an immutable set instance containing the given enum elements.
85 * Internally, the returned set will be backed by an {@link EnumSet}.
86 *
87 * <p>The iteration order of the returned set follows the enum's iteration
88 * order, not the order in which the elements are provided to the method.
89 *
90 * @param anElement one of the elements the set should contain
91 * @param otherElements the rest of the elements the set should contain
92 * @return an immutable set containing those elements, minus duplicates
93 */
94 // http://code.google.com/p/google-web-toolkit/issues/detail?id=3028
95 @GwtCompatible(serializable = true)
96 public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(
97 E anElement, E... otherElements) {
98 return ImmutableEnumSet.asImmutable(EnumSet.of(anElement, otherElements));
99 }
100
101 /**
102 * Returns an immutable set instance containing the given enum elements.
103 * Internally, the returned set will be backed by an {@link EnumSet}.
104 *
105 * <p>The iteration order of the returned set follows the enum's iteration
106 * order, not the order in which the elements appear in the given collection.
107 *
108 * @param elements the elements, all of the same {@code enum} type, that the
109 * set should contain
110 * @return an immutable set containing those elements, minus duplicates
111 */
112 // http://code.google.com/p/google-web-toolkit/issues/detail?id=3028
113 @GwtCompatible(serializable = true)
114 public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(
115 Iterable<E> elements) {
116 if (elements instanceof ImmutableEnumSet) {
117 return (ImmutableEnumSet<E>) elements;
118 } else if (elements instanceof Collection) {
119 Collection<E> collection = (Collection<E>) elements;
120 if (collection.isEmpty()) {
121 return ImmutableSet.of();
122 } else {
123 return ImmutableEnumSet.asImmutable(EnumSet.copyOf(collection));
124 }
125 } else {
126 Iterator<E> itr = elements.iterator();
127 if (itr.hasNext()) {
128 EnumSet<E> enumSet = EnumSet.of(itr.next());
129 Iterators.addAll(enumSet, itr);
130 return ImmutableEnumSet.asImmutable(enumSet);
131 } else {
132 return ImmutableSet.of();
133 }
134 }
135 }
136
137 /**
138 * Returns a new {@code EnumSet} instance containing the given elements.
139 * Unlike {@link EnumSet#copyOf(Collection)}, this method does not produce an
140 * exception on an empty collection, and it may be called on any iterable, not
141 * just a {@code Collection}.
142 */
143 public static <E extends Enum<E>> EnumSet<E> newEnumSet(Iterable<E> iterable,
144 Class<E> elementType) {
145 EnumSet<E> set = EnumSet.noneOf(elementType);
146 Iterables.addAll(set, iterable);
147 return set;
148 }
149
150 // HashSet
151
152 /**
153 * Creates a <i>mutable</i>, empty {@code HashSet} instance.
154 *
155 * <p><b>Note:</b> if mutability is not required, use {@link
156 * ImmutableSet#of()} instead.
157 *
158 * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link
159 * EnumSet#noneOf} instead.
160 *
161 * @return a new, empty {@code HashSet}
162 */
163 public static <E> HashSet<E> newHashSet() {
164 return new HashSet<E>();
165 }
166
167 /**
168 * Creates a <i>mutable</i> {@code HashSet} instance containing the given
169 * elements in unspecified order.
170 *
171 * <p><b>Note:</b> if mutability is not required and the elements are
172 * non-null, use an overload of {@link ImmutableSet#of()} (for varargs) or
173 * {@link ImmutableSet#copyOf(Object[])} (for an array) instead.
174 *
175 * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link
176 * EnumSet#of(Enum, Enum[])} instead.
177 *
178 * @param elements the elements that the set should contain
179 * @return a new {@code HashSet} containing those elements (minus duplicates)
180 */
181 public static <E> HashSet<E> newHashSet(E... elements) {
182 HashSet<E> set = newHashSetWithExpectedSize(elements.length);
183 Collections.addAll(set, elements);
184 return set;
185 }
186
187 /**
188 * Creates a {@code HashSet} instance, with a high enough "initial capacity"
189 * that it <i>should</i> hold {@code expectedSize} elements without growth.
190 * This behavior cannot be broadly guaranteed, but it is observed to be true
191 * for OpenJDK 1.6. It also can't be guaranteed that the method isn't
192 * inadvertently <i>oversizing</i> the returned set.
193 *
194 * @param expectedSize the number of elements you expect to add to the
195 * returned set
196 * @return a new, empty {@code HashSet} with enough capacity to hold {@code
197 * expectedSize} elements without resizing
198 * @throws IllegalArgumentException if {@code expectedSize} is negative
199 */
200 public static <E> HashSet<E> newHashSetWithExpectedSize(int expectedSize) {
201 return new HashSet<E>(Maps.capacity(expectedSize));
202 }
203
204 /**
205 * Creates a <i>mutable</i> {@code HashSet} instance containing the given
206 * elements in unspecified order.
207 *
208 * <p><b>Note:</b> if mutability is not required and the elements are
209 * non-null, use {@link ImmutableSet#copyOf(Iterable)} instead.
210 *
211 * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use
212 * {@link #newEnumSet(Iterable, Class)} instead.
213 *
214 * @param elements the elements that the set should contain
215 * @return a new {@code HashSet} containing those elements (minus duplicates)
216 */
217 public static <E> HashSet<E> newHashSet(Iterable<? extends E> elements) {
218 return (elements instanceof Collection)
219 ? new HashSet<E>(Collections2.cast(elements))
220 : newHashSet(elements.iterator());
221 }
222
223 /**
224 * Creates a <i>mutable</i> {@code HashSet} instance containing the given
225 * elements in unspecified order.
226 *
227 * <p><b>Note:</b> if mutability is not required and the elements are
228 * non-null, use {@link ImmutableSet#copyOf(Iterable)} instead.
229 *
230 * <p><b>Note:</b> if {@code E} is an {@link Enum} type, you should create an
231 * {@link EnumSet} instead.
232 *
233 * @param elements the elements that the set should contain
234 * @return a new {@code HashSet} containing those elements (minus duplicates)
235 */
236 public static <E> HashSet<E> newHashSet(Iterator<? extends E> elements) {
237 HashSet<E> set = newHashSet();
238 Iterators.addAll(set, elements);
239 return set;
240 }
241
242 /**
243 * Creates a thread-safe set backed by a hash map. The set is backed by a
244 * {@link ConcurrentHashMap} instance, and thus carries the same concurrency
245 * guarantees.
246 *
247 * <p>Unlike {@code HashSet}, this class does NOT allow {@code null} to be
248 * used as an element. The set is serializable.
249 *
250 * @return a new, empty thread-safe {@code Set}
251 * @since 15.0
252 */
253 public static <E> Set<E> newConcurrentHashSet() {
254 return newSetFromMap(new ConcurrentHashMap<E, Boolean>());
255 }
256
257 /**
258 * Creates a thread-safe set backed by a hash map and containing the given
259 * elements. The set is backed by a {@link ConcurrentHashMap} instance, and
260 * thus carries the same concurrency guarantees.
261 *
262 * <p>Unlike {@code HashSet}, this class does NOT allow {@code null} to be
263 * used as an element. The set is serializable.
264 *
265 * @param elements the elements that the set should contain
266 * @return a new thread-safe set containing those elements (minus duplicates)
267 * @throws NullPointerException if {@code elements} or any of its contents is
268 * null
269 * @since 15.0
270 */
271 public static <E> Set<E> newConcurrentHashSet(
272 Iterable<? extends E> elements) {
273 Set<E> set = newConcurrentHashSet();
274 Iterables.addAll(set, elements);
275 return set;
276 }
277
278 // LinkedHashSet
279
280 /**
281 * Creates a <i>mutable</i>, empty {@code LinkedHashSet} instance.
282 *
283 * <p><b>Note:</b> if mutability is not required, use {@link
284 * ImmutableSet#of()} instead.
285 *
286 * @return a new, empty {@code LinkedHashSet}
287 */
288 public static <E> LinkedHashSet<E> newLinkedHashSet() {
289 return new LinkedHashSet<E>();
290 }
291
292 /**
293 * Creates a {@code LinkedHashSet} instance, with a high enough "initial
294 * capacity" that it <i>should</i> hold {@code expectedSize} elements without
295 * growth. This behavior cannot be broadly guaranteed, but it is observed to
296 * be true for OpenJDK 1.6. It also can't be guaranteed that the method isn't
297 * inadvertently <i>oversizing</i> the returned set.
298 *
299 * @param expectedSize the number of elements you expect to add to the
300 * returned set
301 * @return a new, empty {@code LinkedHashSet} with enough capacity to hold
302 * {@code expectedSize} elements without resizing
303 * @throws IllegalArgumentException if {@code expectedSize} is negative
304 * @since 11.0
305 */
306 public static <E> LinkedHashSet<E> newLinkedHashSetWithExpectedSize(
307 int expectedSize) {
308 return new LinkedHashSet<E>(Maps.capacity(expectedSize));
309 }
310
311 /**
312 * Creates a <i>mutable</i> {@code LinkedHashSet} instance containing the
313 * given elements in order.
314 *
315 * <p><b>Note:</b> if mutability is not required and the elements are
316 * non-null, use {@link ImmutableSet#copyOf(Iterable)} instead.
317 *
318 * @param elements the elements that the set should contain, in order
319 * @return a new {@code LinkedHashSet} containing those elements (minus
320 * duplicates)
321 */
322 public static <E> LinkedHashSet<E> newLinkedHashSet(
323 Iterable<? extends E> elements) {
324 if (elements instanceof Collection) {
325 return new LinkedHashSet<E>(Collections2.cast(elements));
326 }
327 LinkedHashSet<E> set = newLinkedHashSet();
328 Iterables.addAll(set, elements);
329 return set;
330 }
331
332 // TreeSet
333
334 /**
335 * Creates a <i>mutable</i>, empty {@code TreeSet} instance sorted by the
336 * natural sort ordering of its elements.
337 *
338 * <p><b>Note:</b> if mutability is not required, use {@link
339 * ImmutableSortedSet#of()} instead.
340 *
341 * @return a new, empty {@code TreeSet}
342 */
343 public static <E extends Comparable> TreeSet<E> newTreeSet() {
344 return new TreeSet<E>();
345 }
346
347 /**
348 * Creates a <i>mutable</i> {@code TreeSet} instance containing the given
349 * elements sorted by their natural ordering.
350 *
351 * <p><b>Note:</b> if mutability is not required, use {@link
352 * ImmutableSortedSet#copyOf(Iterable)} instead.
353 *
354 * <p><b>Note:</b> If {@code elements} is a {@code SortedSet} with an explicit
355 * comparator, this method has different behavior than
356 * {@link TreeSet#TreeSet(SortedSet)}, which returns a {@code TreeSet} with
357 * that comparator.
358 *
359 * @param elements the elements that the set should contain
360 * @return a new {@code TreeSet} containing those elements (minus duplicates)
361 */
362 public static <E extends Comparable> TreeSet<E> newTreeSet(
363 Iterable<? extends E> elements) {
364 TreeSet<E> set = newTreeSet();
365 Iterables.addAll(set, elements);
366 return set;
367 }
368
369 /**
370 * Creates a <i>mutable</i>, empty {@code TreeSet} instance with the given
371 * comparator.
372 *
373 * <p><b>Note:</b> if mutability is not required, use {@code
374 * ImmutableSortedSet.orderedBy(comparator).build()} instead.
375 *
376 * @param comparator the comparator to use to sort the set
377 * @return a new, empty {@code TreeSet}
378 * @throws NullPointerException if {@code comparator} is null
379 */
380 public static <E> TreeSet<E> newTreeSet(Comparator<? super E> comparator) {
381 return new TreeSet<E>(checkNotNull(comparator));
382 }
383
384 /**
385 * Creates an empty {@code Set} that uses identity to determine equality. It
386 * compares object references, instead of calling {@code equals}, to
387 * determine whether a provided object matches an element in the set. For
388 * example, {@code contains} returns {@code false} when passed an object that
389 * equals a set member, but isn't the same instance. This behavior is similar
390 * to the way {@code IdentityHashMap} handles key lookups.
391 *
392 * @since 8.0
393 */
394 public static <E> Set<E> newIdentityHashSet() {
395 return Sets.newSetFromMap(Maps.<E, Boolean>newIdentityHashMap());
396 }
397
398 /**
399 * Creates an empty {@code CopyOnWriteArraySet} instance.
400 *
401 * <p><b>Note:</b> if you need an immutable empty {@link Set}, use
402 * {@link Collections#emptySet} instead.
403 *
404 * @return a new, empty {@code CopyOnWriteArraySet}
405 * @since 12.0
406 */
407 @GwtIncompatible("CopyOnWriteArraySet")
408 public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet() {
409 return new CopyOnWriteArraySet<E>();
410 }
411
412 /**
413 * Creates a {@code CopyOnWriteArraySet} instance containing the given elements.
414 *
415 * @param elements the elements that the set should contain, in order
416 * @return a new {@code CopyOnWriteArraySet} containing those elements
417 * @since 12.0
418 */
419 @GwtIncompatible("CopyOnWriteArraySet")
420 public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(
421 Iterable<? extends E> elements) {
422 // We copy elements to an ArrayList first, rather than incurring the
423 // quadratic cost of adding them to the COWAS directly.
424 Collection<? extends E> elementsCollection = (elements instanceof Collection)
425 ? Collections2.cast(elements)
426 : Lists.newArrayList(elements);
427 return new CopyOnWriteArraySet<E>(elementsCollection);
428 }
429
430 /**
431 * Creates an {@code EnumSet} consisting of all enum values that are not in
432 * the specified collection. If the collection is an {@link EnumSet}, this
433 * method has the same behavior as {@link EnumSet#complementOf}. Otherwise,
434 * the specified collection must contain at least one element, in order to
435 * determine the element type. If the collection could be empty, use
436 * {@link #complementOf(Collection, Class)} instead of this method.
437 *
438 * @param collection the collection whose complement should be stored in the
439 * enum set
440 * @return a new, modifiable {@code EnumSet} containing all values of the enum
441 * that aren't present in the given collection
442 * @throws IllegalArgumentException if {@code collection} is not an
443 * {@code EnumSet} instance and contains no elements
444 */
445 public static <E extends Enum<E>> EnumSet<E> complementOf(
446 Collection<E> collection) {
447 if (collection instanceof EnumSet) {
448 return EnumSet.complementOf((EnumSet<E>) collection);
449 }
450 checkArgument(!collection.isEmpty(),
451 "collection is empty; use the other version of this method");
452 Class<E> type = collection.iterator().next().getDeclaringClass();
453 return makeComplementByHand(collection, type);
454 }
455
456 /**
457 * Creates an {@code EnumSet} consisting of all enum values that are not in
458 * the specified collection. This is equivalent to
459 * {@link EnumSet#complementOf}, but can act on any input collection, as long
460 * as the elements are of enum type.
461 *
462 * @param collection the collection whose complement should be stored in the
463 * {@code EnumSet}
464 * @param type the type of the elements in the set
465 * @return a new, modifiable {@code EnumSet} initially containing all the
466 * values of the enum not present in the given collection
467 */
468 public static <E extends Enum<E>> EnumSet<E> complementOf(
469 Collection<E> collection, Class<E> type) {
470 checkNotNull(collection);
471 return (collection instanceof EnumSet)
472 ? EnumSet.complementOf((EnumSet<E>) collection)
473 : makeComplementByHand(collection, type);
474 }
475
476 private static <E extends Enum<E>> EnumSet<E> makeComplementByHand(
477 Collection<E> collection, Class<E> type) {
478 EnumSet<E> result = EnumSet.allOf(type);
479 result.removeAll(collection);
480 return result;
481 }
482
483 /**
484 * Returns a set backed by the specified map. The resulting set displays
485 * the same ordering, concurrency, and performance characteristics as the
486 * backing map. In essence, this factory method provides a {@link Set}
487 * implementation corresponding to any {@link Map} implementation. There is no
488 * need to use this method on a {@link Map} implementation that already has a
489 * corresponding {@link Set} implementation (such as {@link java.util.HashMap}
490 * or {@link java.util.TreeMap}).
491 *
492 * <p>Each method invocation on the set returned by this method results in
493 * exactly one method invocation on the backing map or its {@code keySet}
494 * view, with one exception. The {@code addAll} method is implemented as a
495 * sequence of {@code put} invocations on the backing map.
496 *
497 * <p>The specified map must be empty at the time this method is invoked,
498 * and should not be accessed directly after this method returns. These
499 * conditions are ensured if the map is created empty, passed directly
500 * to this method, and no reference to the map is retained, as illustrated
501 * in the following code fragment: <pre> {@code
502 *
503 * Set<Object> identityHashSet = Sets.newSetFromMap(
504 * new IdentityHashMap<Object, Boolean>());}</pre>
505 *
506 * <p>This method has the same behavior as the JDK 6 method
507 * {@code Collections.newSetFromMap()}. The returned set is serializable if
508 * the backing map is.
509 *
510 * @param map the backing map
511 * @return the set backed by the map
512 * @throws IllegalArgumentException if {@code map} is not empty
513 */
514 public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
515 return Platform.newSetFromMap(map);
516 }
517
518 /**
519 * An unmodifiable view of a set which may be backed by other sets; this view
520 * will change as the backing sets do. Contains methods to copy the data into
521 * a new set which will then remain stable. There is usually no reason to
522 * retain a reference of type {@code SetView}; typically, you either use it
523 * as a plain {@link Set}, or immediately invoke {@link #immutableCopy} or
524 * {@link #copyInto} and forget the {@code SetView} itself.
525 *
526 * @since 2.0 (imported from Google Collections Library)
527 */
528 public abstract static class SetView<E> extends AbstractSet<E> {
529 private SetView() {} // no subclasses but our own
530
531 /**
532 * Returns an immutable copy of the current contents of this set view.
533 * Does not support null elements.
534 *
535 * <p><b>Warning:</b> this may have unexpected results if a backing set of
536 * this view uses a nonstandard notion of equivalence, for example if it is
537 * a {@link TreeSet} using a comparator that is inconsistent with {@link
538 * Object#equals(Object)}.
539 */
540 public ImmutableSet<E> immutableCopy() {
541 return ImmutableSet.copyOf(this);
542 }
543
544 /**
545 * Copies the current contents of this set view into an existing set. This
546 * method has equivalent behavior to {@code set.addAll(this)}, assuming that
547 * all the sets involved are based on the same notion of equivalence.
548 *
549 * @return a reference to {@code set}, for convenience
550 */
551 // Note: S should logically extend Set<? super E> but can't due to either
552 // some javac bug or some weirdness in the spec, not sure which.
553 public <S extends Set<E>> S copyInto(S set) {
554 set.addAll(this);
555 return set;
556 }
557 }
558
559 /**
560 * Returns an unmodifiable <b>view</b> of the union of two sets. The returned
561 * set contains all elements that are contained in either backing set.
562 * Iterating over the returned set iterates first over all the elements of
563 * {@code set1}, then over each element of {@code set2}, in order, that is not
564 * contained in {@code set1}.
565 *
566 * <p>Results are undefined if {@code set1} and {@code set2} are sets based on
567 * different equivalence relations (as {@link HashSet}, {@link TreeSet}, and
568 * the {@link Map#keySet} of an {@code IdentityHashMap} all are).
569 *
570 * <p><b>Note:</b> The returned view performs better when {@code set1} is the
571 * smaller of the two sets. If you have reason to believe one of your sets
572 * will generally be smaller than the other, pass it first.
573 *
574 * <p>Further, note that the current implementation is not suitable for nested
575 * {@code union} views, i.e. the following should be avoided when in a loop:
576 * {@code union = Sets.union(union, anotherSet);}, since iterating over the resulting
577 * set has a cubic complexity to the depth of the nesting.
578 */
579 public static <E> SetView<E> union(
580 final Set<? extends E> set1, final Set<? extends E> set2) {
581 checkNotNull(set1, "set1");
582 checkNotNull(set2, "set2");
583
584 final Set<? extends E> set2minus1 = difference(set2, set1);
585
586 return new SetView<E>() {
587 @Override public int size() {
588 return set1.size() + set2minus1.size();
589 }
590 @Override public boolean isEmpty() {
591 return set1.isEmpty() && set2.isEmpty();
592 }
593 @Override public Iterator<E> iterator() {
594 return Iterators.unmodifiableIterator(
595 Iterators.concat(set1.iterator(), set2minus1.iterator()));
596 }
597 @Override public boolean contains(Object object) {
598 return set1.contains(object) || set2.contains(object);
599 }
600 @Override public <S extends Set<E>> S copyInto(S set) {
601 set.addAll(set1);
602 set.addAll(set2);
603 return set;
604 }
605 @Override public ImmutableSet<E> immutableCopy() {
606 return new ImmutableSet.Builder<E>()
607 .addAll(set1).addAll(set2).build();
608 }
609 };
610 }
611
612 /**
613 * Returns an unmodifiable <b>view</b> of the intersection of two sets. The
614 * returned set contains all elements that are contained by both backing sets.
615 * The iteration order of the returned set matches that of {@code set1}.
616 *
617 * <p>Results are undefined if {@code set1} and {@code set2} are sets based
618 * on different equivalence relations (as {@code HashSet}, {@code TreeSet},
619 * and the keySet of an {@code IdentityHashMap} all are).
620 *
621 * <p><b>Note:</b> The returned view performs slightly better when {@code
622 * set1} is the smaller of the two sets. If you have reason to believe one of
623 * your sets will generally be smaller than the other, pass it first.
624 * Unfortunately, since this method sets the generic type of the returned set
625 * based on the type of the first set passed, this could in rare cases force
626 * you to make a cast, for example: <pre> {@code
627 *
628 * Set<Object> aFewBadObjects = ...
629 * Set<String> manyBadStrings = ...
630 *
631 * // impossible for a non-String to be in the intersection
632 * SuppressWarnings("unchecked")
633 * Set<String> badStrings = (Set) Sets.intersection(
634 * aFewBadObjects, manyBadStrings);}</pre>
635 *
636 * <p>This is unfortunate, but should come up only very rarely.
637 */
638 public static <E> SetView<E> intersection(
639 final Set<E> set1, final Set<?> set2) {
640 checkNotNull(set1, "set1");
641 checkNotNull(set2, "set2");
642
643 final Predicate<Object> inSet2 = Predicates.in(set2);
644 return new SetView<E>() {
645 @Override public Iterator<E> iterator() {
646 return Iterators.filter(set1.iterator(), inSet2);
647 }
648 @Override public int size() {
649 return Iterators.size(iterator());
650 }
651 @Override public boolean isEmpty() {
652 return !iterator().hasNext();
653 }
654 @Override public boolean contains(Object object) {
655 return set1.contains(object) && set2.contains(object);
656 }
657 @Override public boolean containsAll(Collection<?> collection) {
658 return set1.containsAll(collection)
659 && set2.containsAll(collection);
660 }
661 };
662 }
663
664 /**
665 * Returns an unmodifiable <b>view</b> of the difference of two sets. The
666 * returned set contains all elements that are contained by {@code set1} and
667 * not contained by {@code set2}. {@code set2} may also contain elements not
668 * present in {@code set1}; these are simply ignored. The iteration order of
669 * the returned set matches that of {@code set1}.
670 *
671 * <p>Results are undefined if {@code set1} and {@code set2} are sets based
672 * on different equivalence relations (as {@code HashSet}, {@code TreeSet},
673 * and the keySet of an {@code IdentityHashMap} all are).
674 */
675 public static <E> SetView<E> difference(
676 final Set<E> set1, final Set<?> set2) {
677 checkNotNull(set1, "set1");
678 checkNotNull(set2, "set2");
679
680 final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
681 return new SetView<E>() {
682 @Override public Iterator<E> iterator() {
683 return Iterators.filter(set1.iterator(), notInSet2);
684 }
685 @Override public int size() {
686 return Iterators.size(iterator());
687 }
688 @Override public boolean isEmpty() {
689 return set2.containsAll(set1);
690 }
691 @Override public boolean contains(Object element) {
692 return set1.contains(element) && !set2.contains(element);
693 }
694 };
695 }
696
697 /**
698 * Returns an unmodifiable <b>view</b> of the symmetric difference of two
699 * sets. The returned set contains all elements that are contained in either
700 * {@code set1} or {@code set2} but not in both. The iteration order of the
701 * returned set is undefined.
702 *
703 * <p>Results are undefined if {@code set1} and {@code set2} are sets based
704 * on different equivalence relations (as {@code HashSet}, {@code TreeSet},
705 * and the keySet of an {@code IdentityHashMap} all are).
706 *
707 * @since 3.0
708 */
709 public static <E> SetView<E> symmetricDifference(
710 Set<? extends E> set1, Set<? extends E> set2) {
711 checkNotNull(set1, "set1");
712 checkNotNull(set2, "set2");
713
714 // TODO(kevinb): Replace this with a more efficient implementation
715 return difference(union(set1, set2), intersection(set1, set2));
716 }
717
718 /**
719 * Returns the elements of {@code unfiltered} that satisfy a predicate. The
720 * returned set is a live view of {@code unfiltered}; changes to one affect
721 * the other.
722 *
723 * <p>The resulting set's iterator does not support {@code remove()}, but all
724 * other set methods are supported. When given an element that doesn't satisfy
725 * the predicate, the set's {@code add()} and {@code addAll()} methods throw
726 * an {@link IllegalArgumentException}. When methods such as {@code
727 * removeAll()} and {@code clear()} are called on the filtered set, only
728 * elements that satisfy the filter will be removed from the underlying set.
729 *
730 * <p>The returned set isn't threadsafe or serializable, even if
731 * {@code unfiltered} is.
732 *
733 * <p>Many of the filtered set's methods, such as {@code size()}, iterate
734 * across every element in the underlying set and determine which elements
735 * satisfy the filter. When a live view is <i>not</i> needed, it may be faster
736 * to copy {@code Iterables.filter(unfiltered, predicate)} and use the copy.
737 *
738 * <p><b>Warning:</b> {@code predicate} must be <i>consistent with equals</i>,
739 * as documented at {@link Predicate#apply}. Do not provide a predicate such
740 * as {@code Predicates.instanceOf(ArrayList.class)}, which is inconsistent
741 * with equals. (See {@link Iterables#filter(Iterable, Class)} for related
742 * functionality.)
743 */
744 // TODO(kevinb): how to omit that last sentence when building GWT javadoc?
745 public static <E> Set<E> filter(
746 Set<E> unfiltered, Predicate<? super E> predicate) {
747 if (unfiltered instanceof SortedSet) {
748 return filter((SortedSet<E>) unfiltered, predicate);
749 }
750 if (unfiltered instanceof FilteredSet) {
751 // Support clear(), removeAll(), and retainAll() when filtering a filtered
752 // collection.
753 FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
754 Predicate<E> combinedPredicate
755 = Predicates.<E>and(filtered.predicate, predicate);
756 return new FilteredSet<E>(
757 (Set<E>) filtered.unfiltered, combinedPredicate);
758 }
759
760 return new FilteredSet<E>(
761 checkNotNull(unfiltered), checkNotNull(predicate));
762 }
763
764 private static class FilteredSet<E> extends FilteredCollection<E>
765 implements Set<E> {
766 FilteredSet(Set<E> unfiltered, Predicate<? super E> predicate) {
767 super(unfiltered, predicate);
768 }
769
770 @Override public boolean equals(@Nullable Object object) {
771 return equalsImpl(this, object);
772 }
773
774 @Override public int hashCode() {
775 return hashCodeImpl(this);
776 }
777 }
778
779 /**
780 * Returns the elements of a {@code SortedSet}, {@code unfiltered}, that
781 * satisfy a predicate. The returned set is a live view of {@code unfiltered};
782 * changes to one affect the other.
783 *
784 * <p>The resulting set's iterator does not support {@code remove()}, but all
785 * other set methods are supported. When given an element that doesn't satisfy
786 * the predicate, the set's {@code add()} and {@code addAll()} methods throw
787 * an {@link IllegalArgumentException}. When methods such as
788 * {@code removeAll()} and {@code clear()} are called on the filtered set,
789 * only elements that satisfy the filter will be removed from the underlying
790 * set.
791 *
792 * <p>The returned set isn't threadsafe or serializable, even if
793 * {@code unfiltered} is.
794 *
795 * <p>Many of the filtered set's methods, such as {@code size()}, iterate across
796 * every element in the underlying set and determine which elements satisfy
797 * the filter. When a live view is <i>not</i> needed, it may be faster to copy
798 * {@code Iterables.filter(unfiltered, predicate)} and use the copy.
799 *
800 * <p><b>Warning:</b> {@code predicate} must be <i>consistent with equals</i>,
801 * as documented at {@link Predicate#apply}. Do not provide a predicate such as
802 * {@code Predicates.instanceOf(ArrayList.class)}, which is inconsistent with
803 * equals. (See {@link Iterables#filter(Iterable, Class)} for related
804 * functionality.)
805 *
806 * @since 11.0
807 */
808 public static <E> SortedSet<E> filter(
809 SortedSet<E> unfiltered, Predicate<? super E> predicate) {
810 return Platform.setsFilterSortedSet(unfiltered, predicate);
811 }
812
813 static <E> SortedSet<E> filterSortedIgnoreNavigable(
814 SortedSet<E> unfiltered, Predicate<? super E> predicate) {
815 if (unfiltered instanceof FilteredSet) {
816 // Support clear(), removeAll(), and retainAll() when filtering a filtered
817 // collection.
818 FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
819 Predicate<E> combinedPredicate
820 = Predicates.<E>and(filtered.predicate, predicate);
821 return new FilteredSortedSet<E>(
822 (SortedSet<E>) filtered.unfiltered, combinedPredicate);
823 }
824
825 return new FilteredSortedSet<E>(
826 checkNotNull(unfiltered), checkNotNull(predicate));
827 }
828
829 private static class FilteredSortedSet<E> extends FilteredSet<E>
830 implements SortedSet<E> {
831
832 FilteredSortedSet(SortedSet<E> unfiltered, Predicate<? super E> predicate) {
833 super(unfiltered, predicate);
834 }
835
836 @Override
837 public Comparator<? super E> comparator() {
838 return ((SortedSet<E>) unfiltered).comparator();
839 }
840
841 @Override
842 public SortedSet<E> subSet(E fromElement, E toElement) {
843 return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).subSet(fromElement, toElement),
844 predicate);
845 }
846
847 @Override
848 public SortedSet<E> headSet(E toElement) {
849 return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).headSet(toElement), predicate);
850 }
851
852 @Override
853 public SortedSet<E> tailSet(E fromElement) {
854 return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).tailSet(fromElement), predicate);
855 }
856
857 @Override
858 public E first() {
859 return iterator().next();
860 }
861
862 @Override
863 public E last() {
864 SortedSet<E> sortedUnfiltered = (SortedSet<E>) unfiltered;
865 while (true) {
866 E element = sortedUnfiltered.last();
867 if (predicate.apply(element)) {
868 return element;
869 }
870 sortedUnfiltered = sortedUnfiltered.headSet(element);
871 }
872 }
873 }
874
875 /**
876 * Returns the elements of a {@code NavigableSet}, {@code unfiltered}, that
877 * satisfy a predicate. The returned set is a live view of {@code unfiltered};
878 * changes to one affect the other.
879 *
880 * <p>The resulting set's iterator does not support {@code remove()}, but all
881 * other set methods are supported. When given an element that doesn't satisfy
882 * the predicate, the set's {@code add()} and {@code addAll()} methods throw
883 * an {@link IllegalArgumentException}. When methods such as
884 * {@code removeAll()} and {@code clear()} are called on the filtered set,
885 * only elements that satisfy the filter will be removed from the underlying
886 * set.
887 *
888 * <p>The returned set isn't threadsafe or serializable, even if
889 * {@code unfiltered} is.
890 *
891 * <p>Many of the filtered set's methods, such as {@code size()}, iterate across
892 * every element in the underlying set and determine which elements satisfy
893 * the filter. When a live view is <i>not</i> needed, it may be faster to copy
894 * {@code Iterables.filter(unfiltered, predicate)} and use the copy.
895 *
896 * <p><b>Warning:</b> {@code predicate} must be <i>consistent with equals</i>,
897 * as documented at {@link Predicate#apply}. Do not provide a predicate such as
898 * {@code Predicates.instanceOf(ArrayList.class)}, which is inconsistent with
899 * equals. (See {@link Iterables#filter(Iterable, Class)} for related
900 * functionality.)
901 *
902 * @since 14.0
903 */
904 @GwtIncompatible("NavigableSet")
905 @SuppressWarnings("unchecked")
906 public static <E> NavigableSet<E> filter(
907 NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
908 if (unfiltered instanceof FilteredSet) {
909 // Support clear(), removeAll(), and retainAll() when filtering a filtered
910 // collection.
911 FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
912 Predicate<E> combinedPredicate
913 = Predicates.<E>and(filtered.predicate, predicate);
914 return new FilteredNavigableSet<E>(
915 (NavigableSet<E>) filtered.unfiltered, combinedPredicate);
916 }
917
918 return new FilteredNavigableSet<E>(
919 checkNotNull(unfiltered), checkNotNull(predicate));
920 }
921
922 @GwtIncompatible("NavigableSet")
923 private static class FilteredNavigableSet<E> extends FilteredSortedSet<E>
924 implements NavigableSet<E> {
925 FilteredNavigableSet(NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
926 super(unfiltered, predicate);
927 }
928
929 NavigableSet<E> unfiltered() {
930 return (NavigableSet<E>) unfiltered;
931 }
932
933 @Override
934 @Nullable
935 public E lower(E e) {
936 return Iterators.getNext(headSet(e, false).descendingIterator(), null);
937 }
938
939 @Override
940 @Nullable
941 public E floor(E e) {
942 return Iterators.getNext(headSet(e, true).descendingIterator(), null);
943 }
944
945 @Override
946 public E ceiling(E e) {
947 return Iterables.getFirst(tailSet(e, true), null);
948 }
949
950 @Override
951 public E higher(E e) {
952 return Iterables.getFirst(tailSet(e, false), null);
953 }
954
955 @Override
956 public E pollFirst() {
957 return Iterables.removeFirstMatching(unfiltered(), predicate);
958 }
959
960 @Override
961 public E pollLast() {
962 return Iterables.removeFirstMatching(unfiltered().descendingSet(), predicate);
963 }
964
965 @Override
966 public NavigableSet<E> descendingSet() {
967 return Sets.filter(unfiltered().descendingSet(), predicate);
968 }
969
970 @Override
971 public Iterator<E> descendingIterator() {
972 return Iterators.filter(unfiltered().descendingIterator(), predicate);
973 }
974
975 @Override
976 public E last() {
977 return descendingIterator().next();
978 }
979
980 @Override
981 public NavigableSet<E> subSet(
982 E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
983 return filter(
984 unfiltered().subSet(fromElement, fromInclusive, toElement, toInclusive), predicate);
985 }
986
987 @Override
988 public NavigableSet<E> headSet(E toElement, boolean inclusive) {
989 return filter(unfiltered().headSet(toElement, inclusive), predicate);
990 }
991
992 @Override
993 public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
994 return filter(unfiltered().tailSet(fromElement, inclusive), predicate);
995 }
996 }
997
998 /**
999 * Returns every possible list that can be formed by choosing one element
1000 * from each of the given sets in order; the "n-ary
1001 * <a href="http://en.wikipedia.org/wiki/Cartesian_product">Cartesian
1002 * product</a>" of the sets. For example: <pre> {@code
1003 *
1004 * Sets.cartesianProduct(ImmutableList.of(
1005 * ImmutableSet.of(1, 2),
1006 * ImmutableSet.of("A", "B", "C")))}</pre>
1007 *
1008 * <p>returns a set containing six lists:
1009 *
1010 * <ul>
1011 * <li>{@code ImmutableList.of(1, "A")}
1012 * <li>{@code ImmutableList.of(1, "B")}
1013 * <li>{@code ImmutableList.of(1, "C")}
1014 * <li>{@code ImmutableList.of(2, "A")}
1015 * <li>{@code ImmutableList.of(2, "B")}
1016 * <li>{@code ImmutableList.of(2, "C")}
1017 * </ul>
1018 *
1019 * <p>The result is guaranteed to be in the "traditional", lexicographical
1020 * order for Cartesian products that you would get from nesting for loops:
1021 * <pre> {@code
1022 *
1023 * for (B b0 : sets.get(0)) {
1024 * for (B b1 : sets.get(1)) {
1025 * ...
1026 * ImmutableList<B> tuple = ImmutableList.of(b0, b1, ...);
1027 * // operate on tuple
1028 * }
1029 * }}</pre>
1030 *
1031 * <p>Note that if any input set is empty, the Cartesian product will also be
1032 * empty. If no sets at all are provided (an empty list), the resulting
1033 * Cartesian product has one element, an empty list (counter-intuitive, but
1034 * mathematically consistent).
1035 *
1036 * <p><i>Performance notes:</i> while the cartesian product of sets of size
1037 * {@code m, n, p} is a set of size {@code m x n x p}, its actual memory
1038 * consumption is much smaller. When the cartesian set is constructed, the
1039 * input sets are merely copied. Only as the resulting set is iterated are the
1040 * individual lists created, and these are not retained after iteration.
1041 *
1042 * @param sets the sets to choose elements from, in the order that
1043 * the elements chosen from those sets should appear in the resulting
1044 * lists
1045 * @param <B> any common base class shared by all axes (often just {@link
1046 * Object})
1047 * @return the Cartesian product, as an immutable set containing immutable
1048 * lists
1049 * @throws NullPointerException if {@code sets}, any one of the {@code sets},
1050 * or any element of a provided set is null
1051 * @since 2.0
1052 */
1053 public static <B> Set<List<B>> cartesianProduct(
1054 List<? extends Set<? extends B>> sets) {
1055 return CartesianSet.create(sets);
1056 }
1057
1058 /**
1059 * Returns every possible list that can be formed by choosing one element
1060 * from each of the given sets in order; the "n-ary
1061 * <a href="http://en.wikipedia.org/wiki/Cartesian_product">Cartesian
1062 * product</a>" of the sets. For example: <pre> {@code
1063 *
1064 * Sets.cartesianProduct(
1065 * ImmutableSet.of(1, 2),
1066 * ImmutableSet.of("A", "B", "C"))}</pre>
1067 *
1068 * <p>returns a set containing six lists:
1069 *
1070 * <ul>
1071 * <li>{@code ImmutableList.of(1, "A")}
1072 * <li>{@code ImmutableList.of(1, "B")}
1073 * <li>{@code ImmutableList.of(1, "C")}
1074 * <li>{@code ImmutableList.of(2, "A")}
1075 * <li>{@code ImmutableList.of(2, "B")}
1076 * <li>{@code ImmutableList.of(2, "C")}
1077 * </ul>
1078 *
1079 * <p>The result is guaranteed to be in the "traditional", lexicographical
1080 * order for Cartesian products that you would get from nesting for loops:
1081 * <pre> {@code
1082 *
1083 * for (B b0 : sets.get(0)) {
1084 * for (B b1 : sets.get(1)) {
1085 * ...
1086 * ImmutableList<B> tuple = ImmutableList.of(b0, b1, ...);
1087 * // operate on tuple
1088 * }
1089 * }}</pre>
1090 *
1091 * <p>Note that if any input set is empty, the Cartesian product will also be
1092 * empty. If no sets at all are provided (an empty list), the resulting
1093 * Cartesian product has one element, an empty list (counter-intuitive, but
1094 * mathematically consistent).
1095 *
1096 * <p><i>Performance notes:</i> while the cartesian product of sets of size
1097 * {@code m, n, p} is a set of size {@code m x n x p}, its actual memory
1098 * consumption is much smaller. When the cartesian set is constructed, the
1099 * input sets are merely copied. Only as the resulting set is iterated are the
1100 * individual lists created, and these are not retained after iteration.
1101 *
1102 * @param sets the sets to choose elements from, in the order that
1103 * the elements chosen from those sets should appear in the resulting
1104 * lists
1105 * @param <B> any common base class shared by all axes (often just {@link
1106 * Object})
1107 * @return the Cartesian product, as an immutable set containing immutable
1108 * lists
1109 * @throws NullPointerException if {@code sets}, any one of the {@code sets},
1110 * or any element of a provided set is null
1111 * @since 2.0
1112 */
1113 public static <B> Set<List<B>> cartesianProduct(
1114 Set<? extends B>... sets) {
1115 return cartesianProduct(Arrays.asList(sets));
1116 }
1117
1118 private static final class CartesianSet<E>
1119 extends ForwardingCollection<List<E>> implements Set<List<E>> {
1120 private transient final ImmutableList<ImmutableSet<E>> axes;
1121 private transient final CartesianList<E> delegate;
1122
1123 static <E> Set<List<E>> create(List<? extends Set<? extends E>> sets) {
1124 ImmutableList.Builder<ImmutableSet<E>> axesBuilder =
1125 new ImmutableList.Builder<ImmutableSet<E>>(sets.size());
1126 for (Set<? extends E> set : sets) {
1127 ImmutableSet<E> copy = ImmutableSet.copyOf(set);
1128 if (copy.isEmpty()) {
1129 return ImmutableSet.of();
1130 }
1131 axesBuilder.add(copy);
1132 }
1133 final ImmutableList<ImmutableSet<E>> axes = axesBuilder.build();
1134 ImmutableList<List<E>> listAxes = new ImmutableList<List<E>>() {
1135
1136 @Override
1137 public int size() {
1138 return axes.size();
1139 }
1140
1141 @Override
1142 public List<E> get(int index) {
1143 return axes.get(index).asList();
1144 }
1145
1146 @Override
1147 boolean isPartialView() {
1148 return true;
1149 }
1150 };
1151 return new CartesianSet<E>(axes, new CartesianList<E>(listAxes));
1152 }
1153
1154 private CartesianSet(
1155 ImmutableList<ImmutableSet<E>> axes, CartesianList<E> delegate) {
1156 this.axes = axes;
1157 this.delegate = delegate;
1158 }
1159
1160 @Override
1161 protected Collection<List<E>> delegate() {
1162 return delegate;
1163 }
1164
1165 @Override public boolean equals(@Nullable Object object) {
1166 // Warning: this is broken if size() == 0, so it is critical that we
1167 // substitute an empty ImmutableSet to the user in place of this
1168 if (object instanceof CartesianSet) {
1169 CartesianSet<?> that = (CartesianSet<?>) object;
1170 return this.axes.equals(that.axes);
1171 }
1172 return super.equals(object);
1173 }
1174
1175 @Override
1176 public int hashCode() {
1177 // Warning: this is broken if size() == 0, so it is critical that we
1178 // substitute an empty ImmutableSet to the user in place of this
1179
1180 // It's a weird formula, but tests prove it works.
1181 int adjust = size() - 1;
1182 for (int i = 0; i < axes.size(); i++) {
1183 adjust *= 31;
1184 adjust = ~~adjust;
1185 // in GWT, we have to deal with integer overflow carefully
1186 }
1187 int hash = 1;
1188 for (Set<E> axis : axes) {
1189 hash = 31 * hash + (size() / axis.size() * axis.hashCode());
1190
1191 hash = ~~hash;
1192 }
1193 hash += adjust;
1194 return ~~hash;
1195 }
1196 }
1197
1198 /**
1199 * Returns the set of all possible subsets of {@code set}. For example,
1200 * {@code powerSet(ImmutableSet.of(1, 2))} returns the set {@code {{},
1201 * {1}, {2}, {1, 2}}}.
1202 *
1203 * <p>Elements appear in these subsets in the same iteration order as they
1204 * appeared in the input set. The order in which these subsets appear in the
1205 * outer set is undefined. Note that the power set of the empty set is not the
1206 * empty set, but a one-element set containing the empty set.
1207 *
1208 * <p>The returned set and its constituent sets use {@code equals} to decide
1209 * whether two elements are identical, even if the input set uses a different
1210 * concept of equivalence.
1211 *
1212 * <p><i>Performance notes:</i> while the power set of a set with size {@code
1213 * n} is of size {@code 2^n}, its memory usage is only {@code O(n)}. When the
1214 * power set is constructed, the input set is merely copied. Only as the
1215 * power set is iterated are the individual subsets created, and these subsets
1216 * themselves occupy only a small constant amount of memory.
1217 *
1218 * @param set the set of elements to construct a power set from
1219 * @return the power set, as an immutable set of immutable sets
1220 * @throws IllegalArgumentException if {@code set} has more than 30 unique
1221 * elements (causing the power set size to exceed the {@code int} range)
1222 * @throws NullPointerException if {@code set} is or contains {@code null}
1223 * @see <a href="http://en.wikipedia.org/wiki/Power_set">Power set article at
1224 * Wikipedia</a>
1225 * @since 4.0
1226 */
1227 @GwtCompatible(serializable = false)
1228 public static <E> Set<Set<E>> powerSet(Set<E> set) {
1229 return new PowerSet<E>(set);
1230 }
1231
1232 private static final class SubSet<E> extends AbstractSet<E> {
1233 private final ImmutableMap<E, Integer> inputSet;
1234 private final int mask;
1235
1236 SubSet(ImmutableMap<E, Integer> inputSet, int mask) {
1237 this.inputSet = inputSet;
1238 this.mask = mask;
1239 }
1240
1241 @Override
1242 public Iterator<E> iterator() {
1243 return new UnmodifiableIterator<E>() {
1244 final ImmutableList<E> elements = inputSet.keySet().asList();
1245 int remainingSetBits = mask;
1246
1247 @Override
1248 public boolean hasNext() {
1249 return remainingSetBits != 0;
1250 }
1251
1252 @Override
1253 public E next() {
1254 int index = Integer.numberOfTrailingZeros(remainingSetBits);
1255 if (index == 32) {
1256 throw new NoSuchElementException();
1257 }
1258 remainingSetBits &= ~(1 << index);
1259 return elements.get(index);
1260 }
1261 };
1262 }
1263
1264 @Override
1265 public int size() {
1266 return Integer.bitCount(mask);
1267 }
1268
1269 @Override
1270 public boolean contains(@Nullable Object o) {
1271 Integer index = inputSet.get(o);
1272 return index != null && (mask & (1 << index)) != 0;
1273 }
1274 }
1275
1276 private static final class PowerSet<E> extends AbstractSet<Set<E>> {
1277 final ImmutableMap<E, Integer> inputSet;
1278
1279 PowerSet(Set<E> input) {
1280 ImmutableMap.Builder<E, Integer> builder = ImmutableMap.builder();
1281 int i = 0;
1282 for (E e : checkNotNull(input)) {
1283 builder.put(e, i++);
1284 }
1285 this.inputSet = builder.build();
1286 checkArgument(inputSet.size() <= 30,
1287 "Too many elements to create power set: %s > 30", inputSet.size());
1288 }
1289
1290 @Override public int size() {
1291 return 1 << inputSet.size();
1292 }
1293
1294 @Override public boolean isEmpty() {
1295 return false;
1296 }
1297
1298 @Override public Iterator<Set<E>> iterator() {
1299 return new AbstractIndexedListIterator<Set<E>>(size()) {
1300 @Override protected Set<E> get(final int setBits) {
1301 return new SubSet<E>(inputSet, setBits);
1302 }
1303 };
1304 }
1305
1306 @Override public boolean contains(@Nullable Object obj) {
1307 if (obj instanceof Set) {
1308 Set<?> set = (Set<?>) obj;
1309 return inputSet.keySet().containsAll(set);
1310 }
1311 return false;
1312 }
1313
1314 @Override public boolean equals(@Nullable Object obj) {
1315 if (obj instanceof PowerSet) {
1316 PowerSet<?> that = (PowerSet<?>) obj;
1317 return inputSet.equals(that.inputSet);
1318 }
1319 return super.equals(obj);
1320 }
1321
1322 @Override public int hashCode() {
1323 /*
1324 * The sum of the sums of the hash codes in each subset is just the sum of
1325 * each input element's hash code times the number of sets that element
1326 * appears in. Each element appears in exactly half of the 2^n sets, so:
1327 */
1328 return inputSet.keySet().hashCode() << (inputSet.size() - 1);
1329 }
1330
1331 @Override public String toString() {
1332 return "powerSet(" + inputSet + ")";
1333 }
1334 }
1335
1336 /**
1337 * An implementation for {@link Set#hashCode()}.
1338 */
1339 static int hashCodeImpl(Set<?> s) {
1340 int hashCode = 0;
1341 for (Object o : s) {
1342 hashCode += o != null ? o.hashCode() : 0;
1343
1344 hashCode = ~~hashCode;
1345 // Needed to deal with unusual integer overflow in GWT.
1346 }
1347 return hashCode;
1348 }
1349
1350 /**
1351 * An implementation for {@link Set#equals(Object)}.
1352 */
1353 static boolean equalsImpl(Set<?> s, @Nullable Object object) {
1354 if (s == object) {
1355 return true;
1356 }
1357 if (object instanceof Set) {
1358 Set<?> o = (Set<?>) object;
1359
1360 try {
1361 return s.size() == o.size() && s.containsAll(o);
1362 } catch (NullPointerException ignored) {
1363 return false;
1364 } catch (ClassCastException ignored) {
1365 return false;
1366 }
1367 }
1368 return false;
1369 }
1370
1371 /**
1372 * Returns an unmodifiable view of the specified navigable set. This method
1373 * allows modules to provide users with "read-only" access to internal
1374 * navigable sets. Query operations on the returned set "read through" to the
1375 * specified set, and attempts to modify the returned set, whether direct or
1376 * via its collection views, result in an
1377 * {@code UnsupportedOperationException}.
1378 *
1379 * <p>The returned navigable set will be serializable if the specified
1380 * navigable set is serializable.
1381 *
1382 * @param set the navigable set for which an unmodifiable view is to be
1383 * returned
1384 * @return an unmodifiable view of the specified navigable set
1385 * @since 12.0
1386 */
1387 @GwtIncompatible("NavigableSet")
1388 public static <E> NavigableSet<E> unmodifiableNavigableSet(
1389 NavigableSet<E> set) {
1390 if (set instanceof ImmutableSortedSet
1391 || set instanceof UnmodifiableNavigableSet) {
1392 return set;
1393 }
1394 return new UnmodifiableNavigableSet<E>(set);
1395 }
1396
1397 @GwtIncompatible("NavigableSet")
1398 static final class UnmodifiableNavigableSet<E>
1399 extends ForwardingSortedSet<E> implements NavigableSet<E>, Serializable {
1400 private final NavigableSet<E> delegate;
1401
1402 UnmodifiableNavigableSet(NavigableSet<E> delegate) {
1403 this.delegate = checkNotNull(delegate);
1404 }
1405
1406 @Override
1407 protected SortedSet<E> delegate() {
1408 return Collections.unmodifiableSortedSet(delegate);
1409 }
1410
1411 @Override
1412 public E lower(E e) {
1413 return delegate.lower(e);
1414 }
1415
1416 @Override
1417 public E floor(E e) {
1418 return delegate.floor(e);
1419 }
1420
1421 @Override
1422 public E ceiling(E e) {
1423 return delegate.ceiling(e);
1424 }
1425
1426 @Override
1427 public E higher(E e) {
1428 return delegate.higher(e);
1429 }
1430
1431 @Override
1432 public E pollFirst() {
1433 throw new UnsupportedOperationException();
1434 }
1435
1436 @Override
1437 public E pollLast() {
1438 throw new UnsupportedOperationException();
1439 }
1440
1441 private transient UnmodifiableNavigableSet<E> descendingSet;
1442
1443 @Override
1444 public NavigableSet<E> descendingSet() {
1445 UnmodifiableNavigableSet<E> result = descendingSet;
1446 if (result == null) {
1447 result = descendingSet = new UnmodifiableNavigableSet<E>(
1448 delegate.descendingSet());
1449 result.descendingSet = this;
1450 }
1451 return result;
1452 }
1453
1454 @Override
1455 public Iterator<E> descendingIterator() {
1456 return Iterators.unmodifiableIterator(delegate.descendingIterator());
1457 }
1458
1459 @Override
1460 public NavigableSet<E> subSet(
1461 E fromElement,
1462 boolean fromInclusive,
1463 E toElement,
1464 boolean toInclusive) {
1465 return unmodifiableNavigableSet(delegate.subSet(
1466 fromElement,
1467 fromInclusive,
1468 toElement,
1469 toInclusive));
1470 }
1471
1472 @Override
1473 public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1474 return unmodifiableNavigableSet(delegate.headSet(toElement, inclusive));
1475 }
1476
1477 @Override
1478 public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1479 return unmodifiableNavigableSet(
1480 delegate.tailSet(fromElement, inclusive));
1481 }
1482
1483 private static final long serialVersionUID = 0;
1484 }
1485
1486 /**
1487 * Returns a synchronized (thread-safe) navigable set backed by the specified
1488 * navigable set. In order to guarantee serial access, it is critical that
1489 * <b>all</b> access to the backing navigable set is accomplished
1490 * through the returned navigable set (or its views).
1491 *
1492 * <p>It is imperative that the user manually synchronize on the returned
1493 * sorted set when iterating over it or any of its {@code descendingSet},
1494 * {@code subSet}, {@code headSet}, or {@code tailSet} views. <pre> {@code
1495 *
1496 * NavigableSet<E> set = synchronizedNavigableSet(new TreeSet<E>());
1497 * ...
1498 * synchronized (set) {
1499 * // Must be in the synchronized block
1500 * Iterator<E> it = set.iterator();
1501 * while (it.hasNext()) {
1502 * foo(it.next());
1503 * }
1504 * }}</pre>
1505 *
1506 * <p>or: <pre> {@code
1507 *
1508 * NavigableSet<E> set = synchronizedNavigableSet(new TreeSet<E>());
1509 * NavigableSet<E> set2 = set.descendingSet().headSet(foo);
1510 * ...
1511 * synchronized (set) { // Note: set, not set2!!!
1512 * // Must be in the synchronized block
1513 * Iterator<E> it = set2.descendingIterator();
1514 * while (it.hasNext())
1515 * foo(it.next());
1516 * }
1517 * }}</pre>
1518 *
1519 * <p>Failure to follow this advice may result in non-deterministic behavior.
1520 *
1521 * <p>The returned navigable set will be serializable if the specified
1522 * navigable set is serializable.
1523 *
1524 * @param navigableSet the navigable set to be "wrapped" in a synchronized
1525 * navigable set.
1526 * @return a synchronized view of the specified navigable set.
1527 * @since 13.0
1528 */
1529 @GwtIncompatible("NavigableSet")
1530 public static <E> NavigableSet<E> synchronizedNavigableSet(
1531 NavigableSet<E> navigableSet) {
1532 return Synchronized.navigableSet(navigableSet);
1533 }
1534
1535 /**
1536 * Remove each element in an iterable from a set.
1537 */
1538 static boolean removeAllImpl(Set<?> set, Iterator<?> iterator) {
1539 boolean changed = false;
1540 while (iterator.hasNext()) {
1541 changed |= set.remove(iterator.next());
1542 }
1543 return changed;
1544 }
1545
1546 static boolean removeAllImpl(Set<?> set, Collection<?> collection) {
1547 checkNotNull(collection); // for GWT
1548 if (collection instanceof Multiset) {
1549 collection = ((Multiset<?>) collection).elementSet();
1550 }
1551 /*
1552 * AbstractSet.removeAll(List) has quadratic behavior if the list size
1553 * is just less than the set's size. We augment the test by
1554 * assuming that sets have fast contains() performance, and other
1555 * collections don't. See
1556 * http://code.google.com/p/guava-libraries/issues/detail?id=1013
1557 */
1558 if (collection instanceof Set && collection.size() > set.size()) {
1559 return Iterators.removeAll(set.iterator(), collection);
1560 } else {
1561 return removeAllImpl(set, collection.iterator());
1562 }
1563 }
1564
1565 @GwtIncompatible("NavigableSet")
1566 static class DescendingSet<E> extends ForwardingNavigableSet<E> {
1567 private final NavigableSet<E> forward;
1568
1569 DescendingSet(NavigableSet<E> forward) {
1570 this.forward = forward;
1571 }
1572
1573 @Override
1574 protected NavigableSet<E> delegate() {
1575 return forward;
1576 }
1577
1578 @Override
1579 public E lower(E e) {
1580 return forward.higher(e);
1581 }
1582
1583 @Override
1584 public E floor(E e) {
1585 return forward.ceiling(e);
1586 }
1587
1588 @Override
1589 public E ceiling(E e) {
1590 return forward.floor(e);
1591 }
1592
1593 @Override
1594 public E higher(E e) {
1595 return forward.lower(e);
1596 }
1597
1598 @Override
1599 public E pollFirst() {
1600 return forward.pollLast();
1601 }
1602
1603 @Override
1604 public E pollLast() {
1605 return forward.pollFirst();
1606 }
1607
1608 @Override
1609 public NavigableSet<E> descendingSet() {
1610 return forward;
1611 }
1612
1613 @Override
1614 public Iterator<E> descendingIterator() {
1615 return forward.iterator();
1616 }
1617
1618 @Override
1619 public NavigableSet<E> subSet(
1620 E fromElement,
1621 boolean fromInclusive,
1622 E toElement,
1623 boolean toInclusive) {
1624 return forward.subSet(toElement, toInclusive, fromElement, fromInclusive).descendingSet();
1625 }
1626
1627 @Override
1628 public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1629 return forward.tailSet(toElement, inclusive).descendingSet();
1630 }
1631
1632 @Override
1633 public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1634 return forward.headSet(fromElement, inclusive).descendingSet();
1635 }
1636
1637 @SuppressWarnings("unchecked")
1638 @Override
1639 public Comparator<? super E> comparator() {
1640 Comparator<? super E> forwardComparator = forward.comparator();
1641 if (forwardComparator == null) {
1642 return (Comparator) Ordering.natural().reverse();
1643 } else {
1644 return reverse(forwardComparator);
1645 }
1646 }
1647
1648 // If we inline this, we get a javac error.
1649 private static <T> Ordering<T> reverse(Comparator<T> forward) {
1650 return Ordering.from(forward).reverse();
1651 }
1652
1653 @Override
1654 public E first() {
1655 return forward.last();
1656 }
1657
1658 @Override
1659 public SortedSet<E> headSet(E toElement) {
1660 return standardHeadSet(toElement);
1661 }
1662
1663 @Override
1664 public E last() {
1665 return forward.first();
1666 }
1667
1668 @Override
1669 public SortedSet<E> subSet(E fromElement, E toElement) {
1670 return standardSubSet(fromElement, toElement);
1671 }
1672
1673 @Override
1674 public SortedSet<E> tailSet(E fromElement) {
1675 return standardTailSet(fromElement);
1676 }
1677
1678 @Override
1679 public Iterator<E> iterator() {
1680 return forward.descendingIterator();
1681 }
1682
1683 @Override
1684 public Object[] toArray() {
1685 return standardToArray();
1686 }
1687
1688 @Override
1689 public <T> T[] toArray(T[] array) {
1690 return standardToArray(array);
1691 }
1692
1693 @Override
1694 public String toString() {
1695 return standardToString();
1696 }
1697 }
1698 }